CSS 애니메이션 vs JavaScript 애니메이션
작성일 : 2025.01.13
개요
웹 애니메이션을 구현하는 방법은 크게 CSS와 JavaScript 두 가지가 있습니다. 각각의 특징과 장단점을 자세히 살펴보면서, 어떤 상황에서 어떤 방식을 선택해야 할지 알아보겠습니다.
CSS 애니메이션의 특징
1. 성능
CSS 애니메이션은 브라우저의 메인 스레드가 아닌 컴포지터 스레드에서 실행됩니다. 이는 다음과 같은 이점을 제공합니다:
- 메인 스레드의 JavaScript 실행이나 레이아웃 계산에 영향을 받지 않음
- GPU 가속을 자동으로 활용할 수 있어 하드웨어 가속의 이점을 얻기 쉬움
- 부드러운 60fps 애니메이션 구현이 용이함
2. 구현 방식
CSS 애니메이션은 두 가지 방식으로 구현할 수 있습니다:
/* 1. @keyframes를 사용한 애니메이션 */
@keyframes slide {
from {
transform: translateX(0);
}
to {
transform: translateX(100px);
}
}
.sliding-element {
animation: slide 2s ease-in-out infinite;
}
/* 2. transition을 사용한 간단한 상태 변화 */
.button {
transition: all 0.3s ease;
}
.button:hover {
transform: scale(1.1);
}
3. CSS 애니메이션의 장점
- 간단한 구현: 복잡한 JavaScript 코드 없이도 구현 가능
- 선언적 정의: 애니메이션의 시작과 끝 상태를 명확하게 정의
- 성능 최적화: 브라우저가 자동으로 최적화를 수행
- 부드러운 실행: 60fps를 쉽게 달성할 수 있음
4. CSS 애니메이션의 단점
- 복잡한 제어의 한계: 동적인 변화나 조건부 실행이 제한적
- 세밀 한 제어의 어려움: 중간에 애니메이션을 멈추거나 변경하기 어려움
- 지원하는 속성의 제한: 모든 CSS 속성이 애니메이션 가능한 것은 아님
JavaScript 애니메이션의 특징
1. 구현 방식
JavaScript 애니메이션은 여러 가지 방식으로 구현할 수 있습니다:
// 1. requestAnimationFrame 사용
function animate(element) {
let start = null;
function step(timestamp) {
if (!start) start = timestamp;
const progress = timestamp - start;
element.style.transform = `translateX(${Math.min(progress/10, 200)}px)`;
if (progress < 2000) {
requestAnimationFrame(step);
}
}
requestAnimationFrame(step);
}
// 2. Web Animation API 사용
element.animate([
{ transform: 'translateX(0px)' },
{ transform: 'translateX(100px)' }
], {
duration: 1000,
easing: 'ease-in-out',
iterations: Infinity
});
2. JavaScript 애니메이션의 장점
- 세밀한 제어: 프레임별로 정확한 제어가 가능